/*
 * @Descripttion:
 * @version:
 * @Author: xiaozilai
 * @Date: 2022-11-11 21:08:29
 * @LastEditors: xiaozilai
 * @LastEditTime: 2022-11-12 17:58:24
 */
/*
 * @lc app=leetcode.cn id=1839 lang=cpp
 *
 * [1839] 所有元音按顺序排布的最长子字符串
 *
 * https://leetcode.cn/problems/longest-substring-of-all-vowels-in-order/description/
 *
 * algorithms
 * Medium (51.26%)
 * Likes:    30
 * Dislikes: 0
 * Total Accepted:    10.2K
 * Total Submissions: 19.9K
 * Testcase Example:  '"aeiaaioaaaaeiiiiouuuooaauuaeiu"'
 *
 * 当一个字符串满足如下条件时，我们称它是 美丽的 ：
 *
 *
 * 所有 5 个英文元音字母（'a' ，'e' ，'i' ，'o' ，'u'）都必须 至少 出现一次。
 * 这些元音字母的顺序都必须按照 字典序 升序排布（也就是说所有的 'a' 都在 'e' 前面，所有的 'e' 都在 'i' 前面，以此类推）
 *
 *
 * 比方说，字符串 "aeiou" 和 "aaaaaaeiiiioou" 都是 美丽的 ，但是 "uaeio" ，"aeoiu" 和 "aaaeeeooo"
 * 不是美丽的 。
 *
 * 给你一个只包含英文元音字母的字符串 word ，请你返回 word 中 最长美丽子字符串的长度 。如果不存在这样的子字符串，请返回 0 。
 *
 * 子字符串 是字符串中一个连续的字符序列。
 *
 *
 *
 * 示例 1：
 *
 *
 * 输入：word = "aeiaaioaaaaeiiiiouuuooaauuaeiu"
 * 输出：13
 * 解释：最长子字符串是 "aaaaeiiiiouuu" ，长度为 13 。
 *
 * 示例 2：
 *
 *
 * 输入：word = "aeeeiiiioooauuuaeiou"
 * 输出：5
 * 解释：最长子字符串是 "aeiou" ，长度为 5 。
 *
 *
 * 示例 3：
 *
 *
 * 输入：word = "a"
 * 输出：0
 * 解释：没有美丽子字符串，所以返回 0 。
 *
 *
 *
 *
 * 提示：
 *
 *
 * 1
 * word 只包含字符 'a'，'e'，'i'，'o' 和 'u' 。
 *
 *
 */

// @lc code=start
#include <iostream>
#include <unordered_set>
#include <string>
#include <vector>

using namespace std;

class Solution {
public:
    int longestBeautifulSubstring(string word) {
        int n = word.length();
        vector<char> dict{',', 'a', 'e', 'i', 'o', 'u', '.'};
        int cur_index = 0;
        int ans = 0;
        int left = 0, right = 0;
        if (word[0] == dict[cur_index + 1]) {
            cur_index += 1;
        }
        while (1) {
            // cout << "cur = " << cur_index << ", left = " << left << ", right = " << right << endl;
            if (right >= n - 1) {
                break;
            }
            if (right < n - 1 && (word[right + 1] == dict[cur_index] || word[right + 1] == dict[cur_index + 1])) {
                if (word[right + 1] == dict[cur_index]) {
                    ++right;
                } else if (cur_index == 0) {
                    ++right;
                    left = right;
                    cur_index += 1;
                } else {
                    ++right;
                    cur_index += 1;
                }
            } else {
                ++right;
                left = right;
                if (right < n && word[right] == 'a') {
                    cur_index = 1;
                } else {
                    cur_index = 0;
                }
            }
            if (cur_index == 5) {
                ans = max(ans, right - left + 1);
            }
        }
        return ans;
    }
};
// @lc code=end
